name: CI

on:
  pull_request:
    paths-ignore:
      - '.github/ISSUE_TEMPLATE/*.yaml'
      - '.github/CODEOWNERS'
      - '.github/pull_request_template.md'
      - 'docs/**/*.css'
      - 'docs/**/*.html'
      - 'docs/**/*.ico'
      - 'docs/**/*.md'
      - 'docs/**/*.png'
      - 'docs/**/*.svg'
      - 'mkdocs.yml'
      - 'README.md'
      - 'RELEASING.md'
      - '.sdkmanrc'
  push:
    branches: [ main ]
    paths-ignore:
      - '.github/ISSUE_TEMPLATE/*.yaml'
      - '.github/CODEOWNERS'
      - '.github/pull_request_template.md'
      - 'docs/**/*.css'
      - 'docs/**/*.html'
      - 'docs/**/*.ico'
      - 'docs/**/*.md'
      - 'docs/**/*.png'
      - 'docs/**/*.svg'
      - 'mkdocs.yml'
      - 'README.md'
      - 'RELEASING.md'
      - '.sdkmanrc'

concurrency:
  group: "${{ github.workflow }}-${{ github.head_ref || github.sha }}"
  cancel-in-progress: true

permissions:
  contents: read

env:
  AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
  AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
  GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
  GRADLE_ENTERPRISE_CACHE_PASSWORD: ${{ secrets.GRADLE_ENTERPRISE_CACHE_PASSWORD }}

jobs:
  core:
    runs-on: ubuntu-22.04
    permissions:
      checks: write
    steps:
      - uses: actions/checkout@v4
      - uses: ./.github/actions/setup-build
      - name: Build and test with Gradle
        run: |
          ./gradlew :testcontainers:check --no-daemon --continue --scan
      - uses: ./.github/actions/setup-junit-report

  turbo-mode:
    if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
    runs-on: ubuntu-22.04
    permissions:
      checks: write
    steps:
      - uses: actions/checkout@v4
      - uses: ./.github/actions/setup-build
      - name: Setup Testcontainers Cloud Client
        uses: atomicjar/testcontainers-cloud-setup-action@main
        with:
          token: ${{ secrets.TC_CLOUD_TOKEN }}
          args: --max-concurrency=4
      - name: Test using Testcontainers Cloud with Turbo Mode enabled
        working-directory: ./smoke-test/
        run: |
          ./gradlew check --no-daemon --continue --scan --info
      - uses: ./.github/actions/setup-junit-report

  find_gradle_jobs:
    needs: [core]
    runs-on: ubuntu-22.04
    outputs:
      matrix: ${{ steps.set-matrix.outputs.matrix }}
    steps:
      - uses: actions/checkout@v4
      - uses: ./.github/actions/setup-java
      - name: Setup Gradle Build Action
        uses: gradle/actions/setup-gradle@v3
      - id: set-matrix
        env:
          # Since we override the tests executor,
          # we should not push empty results to the cache
          READ_ONLY_REMOTE_GRADLE_CACHE: true
        run: |
          TASKS=$(./gradlew --no-daemon --parallel -q testMatrix | jq 'del(.[] | select(. == ":testcontainers:check" or startswith(":docs:")))' --compact-output)
          echo $TASKS
          echo "matrix={\"gradle_args\":$TASKS}" >> $GITHUB_OUTPUT
  check:
    needs: [find_gradle_jobs]
    strategy:
      fail-fast: false
      matrix: ${{ fromJson(needs.find_gradle_jobs.outputs.matrix) }}
    runs-on: ubuntu-22.04
    permissions:
      checks: write
    steps:
      - uses: actions/checkout@v4
      - uses: ./.github/actions/setup-build
      - name: Build and test with Gradle (${{matrix.gradle_args}})
        run: |
          ./gradlew --no-daemon --continue --scan ${{matrix.gradle_args}}
      - uses: ./.github/actions/setup-junit-report

  find_examples_jobs:
    needs: [check]
    runs-on: ubuntu-22.04
    outputs:
      matrix: ${{ steps.set-matrix.outputs.matrix }}
    steps:
      - uses: actions/checkout@v4
      - uses: ./.github/actions/setup-java
      - name: Setup Gradle Build Action
        uses: gradle/actions/setup-gradle@v3
      - id: set-matrix
        working-directory: ./examples/
        env:
          # Since we override the tests executor,
          # we should not push empty results to the cache
          READ_ONLY_REMOTE_GRADLE_CACHE: true
        run: |
          TASKS=$(./gradlew --no-daemon --parallel -q testMatrix)
          echo $TASKS
          echo "matrix={\"gradle_args\":$TASKS}" >> $GITHUB_OUTPUT
  check_examples:
    needs: [find_examples_jobs]
    strategy:
      fail-fast: false
      matrix: ${{ fromJson(needs.find_examples_jobs.outputs.matrix) }}
    runs-on: ubuntu-22.04
    permissions:
      checks: write
    steps:
      - uses: actions/checkout@v4
      - uses: ./.github/actions/setup-build
      - name: Build and test Examples with Gradle (${{matrix.gradle_args}})
        working-directory: ./examples/
        run: |
          ./gradlew --no-daemon --continue --scan --info ${{matrix.gradle_args}}
      - uses: ./.github/actions/setup-junit-report

  find_docs_examples_jobs:
    needs: [check_examples]
    runs-on: ubuntu-22.04
    outputs:
      matrix: ${{ steps.set-matrix.outputs.matrix }}
    steps:
      - uses: actions/checkout@v4
      - uses: ./.github/actions/setup-java
      - name: Setup Gradle Build Action
        uses: gradle/actions/setup-gradle@v3
      - id: set-matrix
        env:
          # Since we override the tests executor,
          # we should not push empty results to the cache
          READ_ONLY_REMOTE_GRADLE_CACHE: true
        run: |
          TASKS=$(./gradlew --no-daemon --parallel -q testMatrix | jq 'map(select(startswith(":docs:")))' --compact-output)
          echo $TASKS
          echo "matrix={\"gradle_args\":$TASKS}" >> $GITHUB_OUTPUT
  check_docs_examples:
    needs: [find_docs_examples_jobs]
    strategy:
      fail-fast: false
      matrix: ${{ fromJson(needs.find_docs_examples_jobs.outputs.matrix) }}
    runs-on: ubuntu-22.04
    permissions:
      checks: write
    steps:
      - uses: actions/checkout@v4
      - uses: ./.github/actions/setup-build
      - name: Build and test with Gradle (${{matrix.gradle_args}})
        run: |
          ./gradlew --no-daemon --continue --scan ${{matrix.gradle_args}}
      - uses: ./.github/actions/setup-junit-report
